#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=510;
int f[N];
int p[N];
struct node{
	int x,y,w;
	bool operator<(const node& k) const 
	{
		return w<k.w;
	}
};
vector<node> v;
int Find(int x)
{
	if(f[x]!=x)
	{
		f[x]=Find(f[x]);
	}
	return f[x];
}

int kluscal()
{
	int ret=0;
	for(int i=0;i<v.size();i++)
	{
		node t=v[i];
		if(Find(t.x)!=Find(t.y))
		{
			f[Find(t.x)]=Find(t.y);
			ret+=t.w;
		}
	}
	return ret;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];
		v.push_back({0,i,p[i]});
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int t;
			cin>>t;
			v.push_back({i,j,t});
		}
	}
	
	sort(v.begin(),v.end());
	for(int i=0;i<=n;i++)
		f[i]=i;
	int ret=kluscal();
	cout<<ret<<endl;
	return 0;
}
